
/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#ifndef _NGX_EVENT_CONNECT_H_INCLUDED_
#define _NGX_EVENT_CONNECT_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>


#define NGX_PEER_KEEPALIVE 1
#define NGX_PEER_NEXT      2
#define NGX_PEER_FAILED    4


typedef struct ngx_peer_connection_s ngx_peer_connection_t;

typedef ngx_int_t (*ngx_event_get_peer_pt)(ngx_peer_connection_t *pc,
                                           void                  *data);
typedef void (*ngx_event_free_peer_pt)(ngx_peer_connection_t *pc, void *data,
                                       ngx_uint_t state);
typedef void (*ngx_event_notify_peer_pt)(ngx_peer_connection_t *pc, void *data,
                                         ngx_uint_t type);
typedef ngx_int_t (*ngx_event_set_peer_session_pt)(ngx_peer_connection_t *pc,
                                                   void                  *data);
typedef void (*ngx_event_save_peer_session_pt)(ngx_peer_connection_t *pc,
                                               void                  *data);


struct ngx_peer_connection_s
{
    ngx_connection_t *connection;

    struct sockaddr *sockaddr;
    socklen_t        socklen;
    ngx_str_t       *name;
#if (T_NGX_HTTP_DYNAMIC_RESOLVE)
    ngx_str_t *host;
#endif

    ngx_uint_t tries;
    ngx_msec_t start_time;

    ngx_event_get_peer_pt    get;
    ngx_event_free_peer_pt   free;
    ngx_event_notify_peer_pt notify;
    void                    *data;

#if (NGX_SSL || NGX_COMPAT)
    ngx_event_set_peer_session_pt  set_session;
    ngx_event_save_peer_session_pt save_session;
#endif

    ngx_addr_t *local;

    int type;
    int rcvbuf;

    ngx_log_t *log;

    unsigned cached       : 1;
    unsigned transparent  : 1;
    unsigned so_keepalive : 1;
    unsigned down         : 1;

#if (T_NGX_HTTP_DYNAMIC_RESOLVE)
    unsigned resolved : 2;
#endif

    /* ngx_connection_log_error_e */
    unsigned log_error : 2;

    NGX_COMPAT_BEGIN(2)
    NGX_COMPAT_END
};


ngx_int_t ngx_event_connect_peer(ngx_peer_connection_t *pc);
ngx_int_t ngx_event_get_peer(ngx_peer_connection_t *pc, void *data);


#endif /* _NGX_EVENT_CONNECT_H_INCLUDED_ */
